package taweb.flex.air.fexBrowser.struct
{
	import flash.events.OutputProgressEvent;
	
	import taweb.flex.air.fexBrowser.tree.TreeItem;
	import taweb.flex.air.fexBrowser.tree.TreeLeaf;
	import taweb.flex.air.fexBrowser.util.Tools;

	/**
	 * Un lien WEB.
	 */
	public class LinkNode
	{
		
		/**
		 * L'URL de lien.
		 */
		private var url : String;
		
		/**
		 * Tous les labels détéctés pour le même URL.
		 */
		private var labels : Array;
		
		/**
		 * Le nombre de fois ce lien (URL) a été détecté dans la page.
		 */		
		private var number : int = 1;
		
		/**
		 * Le constructeur.
		 * @param label Le premier label de lien.
		 * @param url L'URL unique de lien.
		 */		
		public function LinkNode(label : String, url : String)
		{
			labels = new Array();
			
			this.labels.push(label);
			this.url = url;
		}
		
		/**
		 * Retourne tous les labels de lien.
		 * @return Les labels de lien.
		 */
		public function get getLabels():Array
		{
			return labels;
		}
		
		/**
		 * Ajoute (sans redondance) un label au lien.
		 * @param label Le label à ajouter si il n'existe pas.
		 */		
		public function addLabel(label:String):void
		{
			// On empêche d'avoir une redondance de même label.
			if(!this.hasLabel(label))
			{
				this.labels.push(label);
			}
		}
		
		/**
		 * Retourne le label de la position fourni.
		 * @param index La position de la bel à récupérer.
		 * @return Le label.
		 * @error RangeError Si l'index est hors la liste des labels.
		 */		
		public function getLabel(index:int):String
		{
			return this.labels[index];
		}
		
		/**
		 * Retourne l'URL de lien.
		 * @return L'URL de lien.
		 */		
		public function get getURL():String
		{
			return this.url;
		}
		
		
		/**
		 * Surcharge la méthode de Object.<br\>
		 * Retourne l'URL de lien.
		 * @return L'URL de lien.
		 */
		public function toString():String
		{
			return this.url;
		}
		
		
		/**
		 * Affiche/Trace l'URL de lien et tous ses labels.
		 * @param indent L'indentation de la ligne de trace.
		 */
		public function print(indent:String):void
		{
			var result:String = indent + " >> " + this.url + " <-- ";
			for each (var labelItem:String in this.labels) {
				result += labelItem + "; ";
			}
			trace(result);
		}
		
		/**
		 * Retourne le nombre de fois que le lien a été détécté dans la page.
		 * @return Le nombre de fois que le lien a été détécté dans la page.
		 */		
		public function get getNumber():int
		{
			return this.number;
		}
		
		/** 
		 * Incrémente les compteur de détéction de lien.
		 */
		public function incNumber():void
		{
			this.number++;
		}
		
		/**
		 * Vérifie si un label existe déjà dans le lien courant.
		 * @param label Le label à chercher.
		 * @return <i>true</i> si le label existe déjà, <i>false</i> sinon.
		 */
		public function hasLabel(label:String):Boolean
		{
			for each (var labelItem:String in this.labels) {
				if(labelItem==label)
				{
					return true;
				}
			}
			return false;
		}
		
		/**
		 * Retourne la structure arborescente à affiche dans le "Tree component"
		 */
		public function getTreeStruct():TreeItem
		{
			var allLabels:String = "";
			for each (var label:String in this.labels)
			{
				allLabels += label + "; ";
			}
			
			return new TreeLeaf(allLabels + " >>> " + this.url,Tools.getRandomColor());
		}
	}
}